function setAjax(obj) {
    // 跳转的地址是必选项
    if (!obj.url) {
        throw new Error("必须传入一个请求地址");
    }
    // 地址必须是一个字符串，需要判断其类型
    // 如果不是就抛错误
    if (Object.prototype.toString.call(obj.url) != '[object String]') {
        throw new Error("请求地址必须是一个字符串");
    }
    // 执行到这里说明是一个字符串地址--地址已经输入正确

    // 接下来判断的是请求方式
    // 如果用户没有传入请求方式，默认就是get请求方式
    if (!obj.method) {
        obj.method = "get";
    }
    // 这里需要限制传入的请求方式必须是get或者post请求方式，还要注意的就是如果用户输入的是大写的GET，需要判断其小写是不是也是get
    if (obj.method.toLowerCase() != "get" && obj.method.toLowerCase() != "post") {
        throw new Error("请求方式必须是get或者post方式");
    }

    // 如果用户没有传入是否传入是否异步，默认是true
    if (obj.async == undefined) {   // ====== 注意这里判断布尔类型数据是否传入数据，不能和其他的一样，需要使用undefined   我的错误点!!!
        obj.async = true;
    }
    // 这里还需要判断用户传入的是不是布尔值类型的数据
    if (Object.prototype.toString.call(obj.async) != '[object Boolean]') {
        throw new Error("是否异步必须传入布尔类型");
    }

    // 开始判断用户是否传入数据
    var data = "";
    if (obj.data) {
        // 开始检验用户传入的数据参数---必须是对象或者是字符串
        if (Object.prototype.toString.call(obj.data) != '[object String]' && Object.prototype.toString.call(obj.data) != '[object Object]') {    // ====注意这里是并且关系，我的错误！！！！
            throw new Error("传入的数据类型必须是字符串或者是对象");
        }
        // 走到这里说明传入的数据类型是字符串或者是对象
        if (Object.prototype.toString.call(obj.data) == '[object Object]') {
            //需要将对象放入地址参数中
            var f = "";
            // 遍历对象取到相应的键值对
            for (var attr in obj.data) {
                data += f + attr + "=" + obj.data[attr];
                f = "&";
            }
        } else if (Object.prototype.toString.call(obj.data) == '[object String]') {
            data = obj.data;
        }
        // 如果是get请求方式，就需要将参数追加在请求路径中
        if (obj.method == "get") {
            obj.url = obj.url + "?" + data;
        }
    }

    // 开始判断请求成功的函数-----成功函数是必选项，
    if (!obj.success) {
        throw new Error("必须传入一个成功函数");
    }
    // 判断是否传入失败函数
    if (!obj.error) {
        obj.error = function () { };
    }
    // 用户已经传入成功函数
    if (Object.prototype.toString.call(obj.success) != '[object Function]' || Object.prototype.toString.call(obj.error) != '[object Function]') {
        throw new Error("成功或者失败函数必须是一个函数类型");
    }

    // 处理数据的类型
    if (!obj.dataType) {
        obj.dataType = "json";
    }
    if (obj.dataType != "string" && obj.dataType != "json") {
        throw new Error("数据类型必须是strng或者是json");
    }
    var xhr = null;
    if (window.XMLHttpRequest) {
        xhr = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        xhr = new ActiveXObject("Microsoft.XMLHTTP");
    } else {
        alert("请升级浏览器");
    }
    xhr.open(obj.method, obj.url, obj.async);
    xhr.onreadystatechange = function () {
        if (xhr.readyState == 4) {
            if (xhr.status >= 200 && xhr.status < 300) {
                var res = xhr.responseText;
                if (obj.dataType == "json") {
                    res = JSON.parse(res);
                }
                obj.success(res);
            } else {
                obj.error();
            }
        }
    }
    // 如果是post的请求方式需要设置请求头
    if (obj.method == "post") {
        xhr.setRequestHeader("content-type", "application/x-www-form-urlencoded")
    }
    xhr.send(data);
}



/* ******************************************封装promiseAjax请求********************************************************** */
function pAjax(obj) {
    return new Promise((resolve, reject) => {
        if (!obj.url) {
            throw new Error("必须传入一个请求地址");
        }
        if (Object.prototype.toString.call(obj.url) != '[object String]') {
            throw new Error("请求地址必须是一个字符串");
        }
        if (!obj.method) {
            obj.method = "get";
        }
        if (obj.method.toLowerCase() != "get" && obj.method.toLowerCase() != "post") {
            throw new Error("请求方式必须是get或者post方式");
        }
        if (obj.async == undefined) {
            obj.async = true;
        }
        if (Object.prototype.toString.call(obj.async) != '[object Boolean]') {
            throw new Error("是否异步必须传入布尔类型");
        }
        var data = "";
        if (obj.data) {
            if (Object.prototype.toString.call(obj.data) != '[object String]' && Object.prototype.toString.call(obj.data) != '[object Object]') {
                throw new Error("传入的数据类型必须是字符串或者是对象");
            }
            if (Object.prototype.toString.call(obj.data) == '[object Object]') {
                var f = "";
                for (var attr in obj.data) {
                    data += f + attr + "=" + obj.data[attr];
                    f = "&";
                }
            } else if (Object.prototype.toString.call(obj.data) == '[object String]') {
                data = obj.data;
            }
            if (obj.method == "get") {
                obj.url = obj.url + "?" + data;
            }
        }
        if (!obj.dataType) {
            obj.dataType = "json";
        }
        if (obj.dataType != "string" && obj.dataType != "json") {
            throw new Error("数据类型必须是strng或者是json");
        }
        var xhr = null;
        if (window.XMLHttpRequest) {
            xhr = new XMLHttpRequest();
        } else if (window.ActiveXObject) {
            xhr = new ActiveXObject("Microsoft.XMLHTTP");
        } else {
            alert("请升级浏览器");
        }
        xhr.open(obj.method, obj.url, obj.async);
        xhr.onreadystatechange = function () {
            if (xhr.readyState == 4) {
                if (xhr.status >= 200 && xhr.status < 300) {
                    var res = xhr.responseText;
                    if (obj.dataType == "json") {
                        res = JSON.parse(res);
                    }
                    resolve(res);
                } else {
                    reject();
                }
            }
        }
        // 如果是post的请求方式需要设置请求头
        if (obj.method == "post") {
            xhr.setRequestHeader("content-type", "application/x-www-form-urlencoded")
        }
        xhr.send(data);
    })
}
